import LinkedList from "../linked-list/LinkedList.js";

export default class Queue {
  constructor() {
    this.list = new LinkedList();
  }

  /**
   * 将数据加入到队列尾部
   * @param {*} value 要加入的数据
   * @returns {Queue}
   */
  enqueue(value) {
    return this.list.append(value);
  }

  /**
   * 弹出队列头部
   * @returns {*|null}
   */
  dequeue() {
    const head = this.list.removeAt(0);
    return head ? head.value : null;
  }

  /**
   * 获取队列头部
   * @returns {*|null}
   */
  peek() {
    return this.list.head ? this.list.head.value : null;
  }

  /**
   * 获取队列长度
   * @returns {number}
   */
  size() {
    return this.list.size();
  }

  /**
   * 判断队列是否为空
   * @returns {boolean}
   */
  isEmpty() {
    return this.list.size() === 0;
  }

  /**
   * 清空队列
   */
  clear() {
    this.list = new LinkedList();
  }

  /**
   * 将队列转化为字符串
   * @param {function} callback 自定义格式化方法
   * @returns {string}
   */
  toString(callback) {
    return this.list.toString(callback);
  }
}
